﻿<%@ WebHandler Language="C#" Class="CheckCode" %>
using System;
using System.Collections;
using System.Data;
using System.Linq;
using System.Web;
using System.Xml.Linq;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
using System.Web.SessionState;

/// <summary>
/// 生成验证码
/// </summary>
public class CheckCode : IHttpHandler, IRequiresSessionState
{

    public void ProcessRequest(HttpContext context)
    {
        string chkCode = string.Empty;
        //颜色列表，用于验证码、噪线、噪点
        Color[] color ={ Color.Black, Color.Red, Color.Blue, Color.Green,

Color.Brown, Color.DarkBlue ,Color.Teal};

        //
        //字体列表，用于验证码

        string[] font = { "Gungsuh","宋体" };

        //验证码的字符集
        char[] character = { '1', '2', '3', '4', '5', '6', '8', '9', '0' };
        Random rnd = new Random();
        //生成验证码字符串
        for (int i = 0; i < 4; i++)
        {
            chkCode += character[rnd.Next(character.Length)];
        }
        //保存验证码的Session
        HttpContext.Current.Session["CheckCode"] = chkCode.ToLower();
        Bitmap bmp = new Bitmap(60, 20);
        Graphics g = Graphics.FromImage(bmp);
        g.Clear(Color.White);
        //画验证码字符串
        Pen borderP=new Pen (  color[rnd.Next(color.Length)]);
        for (int i = 0; i < chkCode.Length; i++)
        {
            string fnt = "宋体";// font[rnd.Next(font.Length)];
            Font ft = new Font(fnt, 14, FontStyle.Bold);
            Color clr = color[rnd.Next(color.Length)];
            g.DrawString(chkCode[i].ToString(), ft, new SolidBrush(clr), i * 13, 0);
        }
        //画噪点
        for (int i = 0; i < 100; i++)
        {
            int x = rnd.Next(bmp.Width);
            int y = rnd.Next(bmp.Height);
            Color clr = color[rnd.Next(color.Length)];
            bmp.SetPixel(x, y, clr);
        }
        //清除该页输出缓存，设置该页无缓存
        context.Response.Buffer = true;
        context.Response.ExpiresAbsolute = System.DateTime.Now.AddMilliseconds(0);
        context.Response.Expires = 0;
        context.Response.CacheControl = "no-cache";
        context.Response.AppendHeader("Pragma", "No-Cache");
        //将验证码图片写入内存流,并并将其以是 “image/Png” 格式输出
        MemoryStream ms = new MemoryStream();
        try
        {
            bmp.Save(ms, ImageFormat.Png);
            context.Response.ClearContent();
            context.Response.ContentType = "image/Png";
            context.Response.BinaryWrite(ms.ToArray());
        }
        finally
        {
            //显式释放资源
            bmp.Dispose();
            g.Dispose();
        }
    }

    public bool IsReusable
    {
        get
        {
            return true;
        }
    }
}
